#include "Log.hpp"
#include "ThreadPool.hpp"
#include "Task.hpp"
#include <memory> //智能指针头文件
using namespace LogModule;
using namespace ThreadPoolModule;
using namespace std;

int main()
{
    // make_unique构建对象返回智能指针的做法——c++14
    // 往显示器上打就构建ConsoleLogStrategy对象的智能指针
    // unique_ptr<LogStrategy> strategy = make_unique<ConsoleLogStrategy>();
    // unique_ptr<LogStrategy> strategy = make_unique<FileLogStrategy>();
    // strategy指针，实际指向ConsoleLogStrategy对象智能指针
    // 通过基类指针调用纯虚函数SyncLog
    // 运行时会根据实际对象类型ConsoleLogStrategy执行对应子类的重写实现
    // strategy->SyncLog("hello log!");

    // 使用全局的Logger类对象
    // logger.EnableFileLogStrategy();
    // logger(LogLevel::DEBUG, "main.cc", 10) << "hello world" << 3.14 << " " << 8899;

    // 使用宏之后
    // Enable_Console_Log_Strategy();
    // LOG(LogLevel::DEBUG) << "hello world " << 3.14 << " " << 666;
    // LOG(LogLevel::DEBUG) << "hello Log! " << 3.14 << " " << 666;
    // LOG(LogLevel::DEBUG) << "hello Thread!! " << 3.14 << " " << 666;

    Enable_Console_Log_Strategy();
    // 原来操作线程池的方式
    //  ThreadPool<task_t> *tp = new ThreadPool<task_t>(); // 在堆上构建线程池对象
    //  tp->Start();

    int count = 10;
    while (count)
    {
        // 在现在我们单例模式的版本中
        // 用该方法获取对象，再由调用各种公共的成员方法
        ThreadPool<task_t>::GetInstance()->Enqueue(Download);
        count--;
        sleep(1);
    }
    // 线程执行 HandlerTask 时，sleep(1)让线程每秒才输出一次日志，
    // 这里如果不休眠多一点时间，主线程会直接退出，导致线程池线程还没执行几次就被终止
    // sleep(3);
    ThreadPool<task_t>::GetInstance()->Stop();
    // sleep(3);

    ThreadPool<task_t>::GetInstance()->Join();

    return 0;
}